約 5,071,522 件
https://w.atwiki.jp/easybotter_wiki/pages/35.html
?php //============================= //EasyBotterを呼び出します //============================= require_once("EasyBotter.php"); $eb = new EasyBotter(); //$response = $eb- reply(2,"data.txt","reply_pattern.php"); //$response = $eb- postRandom("data.txt"); $response = $eb- autoFollow(); ?
https://w.atwiki.jp/easybotter_wiki/pages/29.html
※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。 特定のアカウントと会話(リプライ)させたくない [#o0aaf045]botと名の付くアカウントを制限する [#n9e81b80] 特定のアカウントを制限する [#v1124dd8] 特定のアカウントとのリプライ回数を制限したい [#hcd8233e]備考 [#ldfe0701]毎日ログをリセットしたい [#y24beea8] 特定のアカウントに対しては、別のリプライパターンを読み込ませたい [#g6a99bfa] 特定のアカウントは自動フォローしない [#hd86ba2c] コメント [#ub9d67da] 特定のアカウントと会話(リプライ)させたくない [#o0aaf045] EasyBotter.php内 //必要なつぶやきのみに絞る function selectTweets($response){ $replies = array(); foreach($response as $reply){ //自分自身のつぶやきを除外する $replyName = (string)$reply- user- screen_name; if($this- _screen_name == $replyName){ continue; } //RT, QTを除外する $text = (string)$reply- text; if(strpos($text,"RT") != FALSE || strpos($text,"QT") != FALSE){ continue; } $replies[] = $reply; } return $replies; } を探す。 botと名の付くアカウントを制限する [#n9e81b80] if($this- _screen_name == $replyName){ を //■■botを除外■■ if($this- _screen_name == $replyName || preg_match("@bot@i",$replyName)){ に変更する。 bot(大小文字関係なく)と名の付くアカウントに対してはリプライしなくなります。 特定のアカウントを制限する [#v1124dd8] if($this- _screen_name == $replyName){ を //■■特定の人を除外■■ $bottername = array("abcd","efgh"); if($this- _screen_name == $replyName || in_array($replyName, $bottername)){ とすることで、abcdとefghという名のアカウントに対してリプライしなくなります。 botと入ってないアカウント名のBOTを指定したい場合に使用して下さい。 特定のアカウントとのリプライ回数を制限したい [#hcd8233e] このサンプルはzkb_otさんのソースを参考にしています。 EasyBotter.php内 //リプライを作る (略) $status = ""; //リプライパターンと照合 if(!empty($this- _replyPatternData[$replyPatternFile])){ を探す。 $status = ""; の直前に //■■会話数制限(リプライ返し)■■ $filenameb = "kaiwalog.txt";//kaiwalog.txtに誰からリプライがあったか最新$botk1件記録する //$filenamebは存在するか? if(!file_exists($filenameb)){ touch($twit_logfile) or die( ファイル作成に失敗\n ); chmod($twit_logfile, 0606) or die( 権限変更に失敗\n );//※パーミッションは鯖によって違います } $botdata = file_get_contents($filenameb); $botdata2 = $botdata; $countk = substr_count($botdata2,(string)$reply- user- screen_name); $botdata = explode(",",$botdata); $kazu = count($botdata); $botkey = 1; $botk1 = "10";$botk1--;//記録件数 $botk2 = "2";//回までOK $bottername = array("abcd","efgh");//制限したいアカウント名をいれる if(preg_match("@bot@i",(string)$reply- user- screen_name) || in_array((string)$reply- user- screen_name,$bottername)){ if ($countk =$botk2){ $botkey = "0"; $botdata = implode(",",$botdata); }else{ while ($kazu $botk1){$botdatax = array_pop($botdata);$kazu = count($botdata);} $botdata=implode(",",$botdata); $botdata=(string)$reply- user- screen_name.",".$botdata; } }else{ while ($kazu $botk1){$botdatax = array_pop($botdata);$kazu = count($botdata);} $botdata=implode(",",$botdata); $botdata=(string)$reply- user- screen_name.",".$botdata; } file_put_contents($filenameb,$botdata); if($botkey == "0"){ continue; } を追記し、保存する。 空のkaiwalog.txtを作成し、EasyBotter.phpと共にサーバーへアップロードする。 kaiwalog.txtはログファイル用のパーミッションにする。 ※作成しなくても自動作成するようにしてありますが、自分で作成してうpするのが確実 備考 [#ldfe0701] リプライをくれたアカウント名を最新10件記録します。 そのうち、bot(大小文字関係なく)と名の付くアカウントから3回目のリプライにはリプライ返ししません(2回まではリプライをする。) abcdとefghという名のアカウントに対しても制限します。 ↑botと入ってないアカウント名のBOTを指定したい場合に使用して下さい。 毎日ログをリセットしたい [#y24beea8] bot.php内 $eb = new EasyBotter(); の直後に //■■リプライした人の記録リセット■■ if(date("H-i")=="00-00"){$fp = fopen("kaiwalog.txt", "w");fclose($fp);} を入れてください。 0時0分にアクセスした時、ファイルを真っ白にしてから処理を行います。 特定のアカウントに対しては、別のリプライパターンを読み込ませたい [#g6a99bfa] EasyBotter.php内 function makeReplyTweets($replies, $replyFile, $replyPatternFile){ if(empty($this- _replyPatternData[$replyPatternFile]) !empty($replyPatternFile)){ $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); } (略) foreach($this- _replyPatternData[$replyPatternFile] as $pattern = $res){ 1. if(empty($this- _replyPatternData[$replyPatternFile]) !empty($replyPatternFile)){ の直後に $org_repfile = $replyPatternFile;//デフォルトのファイル名を保管 を追記する。 2. foreach($this- _replyPatternData[$replyPatternFile] as $pattern = $res){ の直前に //■■特定の人には別パターン■■ $userName = (string)$reply- user- screen_name; switch(true){ case stristr($userName, "bot") //botと名のつくアカウント名に対して $replyPatternFile = "bot_pattern.php";//bot_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); break; case $userName == "abcd" //abcdというアカウント名に対して case $userName == "efgh" //efghというアカウント名に対して $replyPatternFile = "xxx_pattern.php";//xxx_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); break; default //それ以外 $replyPatternFile = $org_repfile;//デフォルトのパターンファイル名 } または //■■特定の人には別パターン■■ $userName = (string)$reply- user- screen_name; if(stristr($userName, "bot")){//botと名のつくアカウント名に対して $replyPatternFile = "bot_pattern.php";//bot_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); }else if($userName == "abcd" || $userName == "efgh"){ $replyPatternFile = "xxx_pattern.php";//xxx_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); }else{ $replyPatternFile = $org_repfile;//デフォルトのパターンファイル名 } を追記する。 特定のアカウントは自動フォローしない [#hd86ba2c] EasyBotter.php内 foreach($followList as $screen_name){ $response = $this- followUser($screen_name); } を foreach($followList as $screen_name){ //■■xxxはフォロー返ししない■■ if(!preg_match("@bot@i",$screen_name)){ $response = $this- followUser($screen_name); } } と変更する。 例ではbotと名のつくアカウントすべて。 コメント [#ub9d67da] 特定のアカウントへのリプライ回数制限を特定ではなく総てのIDに対して10回中4回以上制限するにはどこの記述を替えるのがいいでしょうか?ワイルドカード?とか思って調べてみたんですがうまく動きませんでした。どなたかわかる方いたら教えてください。 -- 名無しさん (2010-11-17 16 38 42) 「特定のアカウントに対しては、別のリプライパターンを読み込ませたい 」をそのままコピペすると、Warning Invalid argument supplied for foreach() が、環境によって出るみたい。その時、foreach((array)$this- _replyPatternData[$replyPatternFile] as $pattern = $res){ に変更すると、解決します。と報告。 -- ナナシ (2010-12-21 22 02 49) 「特定のアカウントに対して別のリプライパターン」を「時間分けポスト」と併用しているのですが、こちらが返したリプライに対するさらなるリプライに、反応語がないとArreyで返してしまいます。対策はありますでしょうか? -- 名無しさん (2011-01-21 08 09 06) 特定のアカウントのTLに対し、個別にリプライパターンを読ませたい場合、上記の「リプライパターンの個別設定」を利用しようとしてるのですがなぜかうまくいきません。どなたかわかりますでしょうか? -- 名無しさん (2011-02-03 00 14 56) 特定のIDに対してTL反応のみさせず、リプライには通常通り返信できるようにしたいのですが可能でしょうか? -- 名無しさん (2011-06-03 01 31 00) 「特定のアカウントとのリプライ回数を制限したい」で特定のIDは制限したまま、botの回数制限は外したいんですが、何か方法はありますか? -- 名無しさん (2011-06-12 23 08 26) ↑「特定のIDは制限したまま、botの回数制限は外したい~」解決しました。 -- 名無しさん (2011-06-16 17 52 22) 「特定のアカウント」ではなく、「特定の単語」でリプライパターンファイルを分ける方法があれば知りたいのですが -- 名無しさん (2011-12-14 00 13 44) 新verだと上記の記述が変わるので、使えないですよね・・・。 -- 名無しさん (2012-11-03 12 11 25) 一応変更したらうまくいった部分書いておきますね。「$userName = (string)$reply- user- screen_name; 」を「$userName = (string)$reply["user"]["screen_name"]; 」にするだけでちゃんと動きます。ただ、これで正解かは不明です。 -- もの (2012-11-03 14 41 52) 『特定のアカウントに対しては、別のリプライパターンを読み込ませたい』のリプライパターンは1アカウントで複数ファイルを用意できるのでしょうか? -- 未熟者 (2013-01-17 23 27 40) 特定のアカウントとのリプライ回数を制限したい [#hcd8233e]は2.1では機能しないのでしょうか。早急に必要なのですが、どこをどうしたら良いのかわからず…。 -- 名無しさん (2013-01-24 19 04 36) 上に書いた者ですが、会話回数制限も、 先に書かれていた方を参考にして 『(string)$reply- user- screen_name』の部分を全て『(string)$reply["user"]["screen_name"]』に置換したら『kaiwalog.txt』に記録され、2.1でも使えました。お騒がせしました。 -- 名無しさん (2013-01-26 15 21 04) TL反応の場合分けは$userName = (string)$tweet["user"]["screen_name"]でいけるとおもう -- 名無しさん (2013-07-17 17 57 45) 名前 コメント
https://w.atwiki.jp/easybotter_wiki/pages/39.html
※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。 このページはBOTを止めるものじゃなく、止まるものに(「簡単じゃない twitter bot」 の作り方メモ)を参考に、 EasyBotter -地震で自動停止を導入しました。-(ハーイ!ともみです!)にて紹介されたものです。 おおまかな手順 地震の震度を取得するPHPを作成する。 震度を取得した日時を記録しておくテキストファイルを作成する。 botが動作中か停止中かフラグを記録するテキストファイルを作成する。 手動で停止状態から復帰させるPHPを作成する。 bot.phpを改造する。 全部をアップロードして動作させる。 おまけ 手動で停止させるPHPを作成する。 地震の震度を取得するPHPを作成する EasyBotterOrg.phpという名前のファイルを作る。 ?php class Easy_botter_org{ function jisin(){ //============================= //地震判定プログラム //============================= /* goo 天気 地震情報RSSを読み込み、震度6以上の場合、震度を返す*/ $earthquake_pubtime_txt = earthquake_pubtime.txt ; //前回のRSS読み込み日時を調べる $last_pubtime = file_get_contents($earthquake_pubtime_txt); if ($last_pubtime == ){ $last_pubtime = date( Y-m-d H i s ,time()-300); } //$last_pubtime = 2011-03-11 14 00 00 ;//TEST $xml = file_get_contents( http //weather.goo.ne.jp/earthquake/index.rdf );//地震情報 - goo 天気 $xml_tree = simplexml_load_string($xml); if (count($xml_tree- channel- item) 0){ $ts = strtotime((string)$xml_tree- channel- item[0]- pubDate); file_put_contents($earthquake_pubtime_txt, date( Y-m-d H i s ,$ts));//読み込み済RSSの日時を保存 chmod($earthquake_pubtime_txt, 0666); } $shindo_num = ; $shindo_str = ; $shindo_pubtime = ; $shindo_text = ; $shindo_basyo = ; $result = array(); foreach($xml_tree- channel- item as $k = $v){ $text = (string)$v- title; $pubtime = date( Y-m-d H i s ,strtotime((string)$v- pubDate)); if ($pubtime = $last_pubtime){ continue; } if ($pubtime date( Y-m-d H i s ,time() - 3600)){//前回から60分(3600秒)以内なら処理しないで次へ continue;//TEST時はここをコメントアウト } //震度を取得し、指定以上ならフラグ立て、処理を終了 preg_match( /震度([0-9]+)[強弱]*/ ,$text,$matches); preg_match( /\[震源地\](.*)\[最大震度\]/ ,$text,$matches_basyo); $shindo = $matches[1]; if (is_numeric($shindo) (int)$shindo = 6){//震度6の場合 $result[ num ] = (int)$matches[1]; $result[ str ] = $matches[0]; $result[ pubtime ] = $pubtime; $result[ text ] = $text; $result[ basyo ] = trim($matches_basyo[1]," "); $result[ word ] = $shindo_str."の地震が".$shindo_basyo."で起きましたので、停止いたします。";//ツィートされます。 break; } } echo $result[ text ]." br / br / "; return $result; } } 震度を取得した日時を記録しておくテキストファイルを作成する。 earthquake_pubtime.txtという名前のテキストファイルを作る。 中身は何も書かなくてOK botが動作中か停止中かフラグを記録するテキストファイルを作成する。 flg_joutai.txtという名前のテキストファイルを作る。 中身は何も書かなくてOK 手動で停止状態から復帰させるPHPを作成する。 start.phpというファイルを作成する。 ?php //============================= //フラグファイル読み出し // 状態フラグ $joutai // [0]stop 動作停止中 //============================= $joutai_txt = file_get_contents("flg_joutai.txt"); if($joutai_txt !== ""){ $joutai = unserialize($joutai_txt); } //============================= //フラグ設定 //============================= $joutai[0] = FALSE; //============================= //フラグファイル格納。 //============================= $response = file_put_contents("flg_joutai.txt" , serialize($joutai)); ? bot.phpを改造する。 bot.php内 ?php //============================= //EasyBotterを呼び出します //============================= require_once("EasyBotter.php"); $eb = new EasyBotter(); //============================= //震度を取得します //============================= require_once("EasyBotterOrg.php"); $ebo = new Easy_botter_org(); //============================= //フラグファイル読み出し // 状態フラグ $joutai // [0]stop 動作停止中 //============================= $joutai_txt = file_get_contents("flg_joutai.txt"); if($joutai_txt !== ""){ $joutai = unserialize($joutai_txt); } //============================= //停止中なら止めてしまう。 //============================= if($joutai[0]){ die("地震で停止しています"); } //この一文は、手動でbot.phpを叩くと表示されます。ツイートはされません。 //============================= //地震判定(毎回) //============================= $shindo = $ebo- jisin(); if( $shindo[ num ] 0){ //値が返ってきてたら $joutai[0] = TRUE; //停止フラグを立てる } //============================= //フラグファイル格納。 //============================= $response = file_put_contents("flg_joutai.txt" , serialize($joutai)); //============================= //ここから下に、通常時のbotの動作を書き込みます。 //============================= ? アップロード ファイルは全て、bot.phpと同じ階層にアップしてください。 きちんと動作すると、flg_joutai.txtを開いた時以下の表示が出ます。 通常時は a 1 {i 0;b 0;} 停止中は a 1 {i 0;b 1;} 停止からまた動かす時は、手動でstart.phpを実行すれば治ります。 おまけ 手動で停止させるPHPを作成する。 ※利用上の注意 pha氏が書いたEasyBotterが勝手に動作させられる可能性とその対策と同じ理屈で、他人にbotを勝手に止められてしまいます。 EasyBotterが勝手に動作させられる可能性とその対策も併せてお読みください。 stop.phpというファイルを作成する。 ?php //============================= //フラグファイル読み出し // 状態フラグ $joutai // [0]stop 動作停止中 //============================= $joutai_txt = file_get_contents("flg_joutai.txt"); if($joutai_txt !== ""){ $joutai = unserialize($joutai_txt); } //============================= //フラグ設定 //============================= $joutai[0] = TRUE; //============================= //フラグファイル格納。 //============================= $response = file_put_contents("flg_joutai.txt" , serialize($joutai)); ? これを、これまでと同じ階層にアップする。 手動でstop.phpを実行すれば停止します。 再度動かす場合は、前述のとおり手動でstart.phpを実行すれば治ります。
https://w.atwiki.jp/easybotter_wiki/pages/22.html
※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。 発見されているバグ会話数制限が機能していない フッターが機能していない {tweet}が機能していない {timeline_id}と{timeline_name}が逆になっている。 修正済みのバグ(ver.2.04betaまで) コメント 発見されているバグ 特に初心者の方は、バックアップを取ってから編集して下さい。 会話数制限が機能していない ID別設定「特定のアカウントとのリプライ回数を制限したい」を参考に フッターが機能していない 改善法:Easybotter.phpを編集する。 if(preg_match("@{.+?}@",$status) == 1){ $status = $this- convertText($status, $tweet); } とある部分の if(preg_match("@{.+?}@",$status) == 1){ } をコメントアウト(//)するか、削除して下さい。 数箇所有ります、すべて行って下さい。~~{}内は絶対に削除しないで下さい。 {tweet}が機能していない 改善法:Easybotter.phpを編集する。 if(strpos($text,"{tweet}") !== FALSE !empty($reply)){ $tweet = preg_replace("@\.?\@[a-zA-Z0-9-_]+\s@u","",$reply- status); $text = str_replace("{tweet}",$tweet,$text); } とある部分を if(strpos($text,"{tweet}") !== FALSE !empty($reply)){ $tweet = preg_replace("@\.?\@[a-zA-Z0-9-_]+\s@u","",$reply- text); $text = str_replace("{tweet}",$tweet,$text); } へまるまる変更して下さい。 {timeline_id}と{timeline_name}が逆になっている。 改善法:Easybotter.phpを編集する。 //タイムラインからランダムに最近発言した人のデータを取る if(strpos($text,"{timeline_id}") !== FALSE){ $randomTweet = $this- getRandomTweet(); $text = str_replace("{timeline_id}", $randomTweet- user- name,$text); } if(strpos($text, "{timeline_name}") !== FALSE){ $randomTweet = $this- getRandomTweet(); $text = str_replace("{timeline_name}",$randomTweet- user- screen_name,$text); } とある部分を //タイムラインからランダムに最近発言した人のデータを取る if(strpos($text,"{timeline_id}") !== FALSE){ $randomTweet = $this- getRandomTweet(); $text = str_replace("{timeline_id}", $randomTweet- user- screen_name,$text); } if(strpos($text, "{timeline_name}") !== FALSE){ $randomTweet = $this- getRandomTweet(); $text = str_replace("{timeline_name}",$randomTweet- user- name,$text); } へまるまる変更して下さい。 修正済みのバグ(ver.2.04betaまで) TL反応で「@」付にも反応してしまう リプライパターンで正規表現が正常に使えない コメント フッターが機能していないは if(preg_match("@{.+?}@",$status) == 1){ $status = $this- convertText($status); } else { $status .= $this- _footer; }でいいんじゃないの。 -- koziki_bot (2011-01-28 09 50 39) TL返信で、会話終了 "END"が効いていないのでは。 EasyBotter.pnp の function makeReplyTimelineTweets の一部を修正 if(empty($status)|| $status == "[[END]]"){ continue; } でいいんじゃないの。 -- koziki_bot (2011-01-31 22 56 54) どこまで返信したか覚えておくカウンターファイルで、RPとTLの両方を使うと、カウンターファイルが同一のため発言抜けが生じる。カウンターファイル(実際はツイッターID番号)を別けると大丈夫です。 -- koziki_bot (2011-02-23 00 25 40) TLの読み込み最大数が20件となっている、count=180位(最大200)にして読み込めば抜けはすくなくなるぞ。 -- koziki_bot (2011-02-23 00 30 49) リプライに関しては上の修正で{tweet}がうまくいったのですが、リプライ内容をTLにつぶやくTLHの機能をつかった場合、記号のまま{tweet}ってつぶやいてしまいます。こういうものなのでしょうか? -- bot1号 (2011-04-29 20 38 54) @返信だけにフッタを付けないやり方はあるでしょうか? -- date (2011-05-17 19 05 47) 名前 コメント
https://w.atwiki.jp/easybotter_wiki/pages/13.html
はじめに 用意するものPHP(5以上)が使えるレンタルサーバー使用実績のあるサーバー botに使うTwitterのアカウント テキストエディタWindows用テキストエディタ Macintosh用テキストエディタ 文字コード(UTF-8)について FTPソフトWindows用 Mac用 はじめに 何も手を加えずそのままうp→最低限の機能を手動で動かす、この間のエラー対処することから始めましょう。 「プログラミングができなくても~」と言っても、公式にも書かれているように、最低限知っておかねばならない言葉や材料があります。 それらを意味を理解しないままスキップして設置解説サイト通りにやっても動かない・分からないといわれても誰も助けてくれません。 あなたがまず理解しないことにはスタートラインに立てないのです。 面倒くさがらず調べて、言われている意味が分かるようになってからプログラムに触れましょう。それからでも遅くはありません。 いきなり設置して、cronでアクセスさせて正常に機能しなかったら、基本的なPHPエラーの原因は分かりません 用意するもの おすすめのものをピックアップしています。 使い方は各自、自己責任で学んでください。 PHP(5以上)が使えるレンタルサーバー 使用実績のあるサーバー 注:実績があるからといっても、最低限サーバー仕様やオンラインマニュアル、よくある質問等にも目を通しておきましょう。 あまりに無知・無茶すぎるとレンタル元から『twitterのbot設置は禁止します』となるかもしれません。 すでにPHP5が使えるサーバーで禁止しているところもあります 有料サーバーJust-Size.Networks XREA plus さくらインターネット (スタンダード以上) LaCoocan(スタンダード以上) ロリポップ 無料サーバーXREA @pages fizby.net TOK2 ちなみに、初心者質問スレなどから見ると@pagesが人気のようです。 land.toはEasyBotterは動作不可。TOK2はSSLが使えないので本体改造が必要。FileQはver.2なら設置可能。 ver1.42でのOAuth認証はland.toと共に出来ない(curlエラー) botに使うTwitterのアカウント Twitter.comからアカウントを登録する。もちろんBOT専用のものを取得する。 ※10個以上の類似したアカウントを取得すると削除される、という情報があります。複数のアカウントを持っている場合は注意して下さい。 テキストエディタ phpに対応していて、コマンドや要素の自動色分けに対応したものを選びたい。 また、Easybotterのファイル群は全て 「文字コード:UTF-8、改行コード LF」 であるので、これを確認・指定できるものだとなお良い。 Windows用テキストエディタ Peggy Pad(Peggy Pad配布元) ※シェアウェアもあるので注意 NoEditor/UnEditor(NoEditor/UnEditor配布元) ※シェアウェアもあるので注意 EmEditor Free(EmEditor Free配布元) ※シェアウェアもあるので注意ツール→すべての設定プロパティで、基本→行番号を表示、記号→全角空白表示にチェックを入れておくと編集に便利 TeraPad(TeraPad配布元)ファイルを保存するときは、文字コード:UTF-8N、改行コード LFで K2Editor(K2Editor配布元) PHPエディタ(PHPエディタ配布元)standalone版おすすめ。PHP(easyPHP等でもok)も同時にDL・インストールしてphp.exeの場所を入力してやると構文チェック機能を使えるようになる。 ソースの先頭数行に全角文字がない場合は、読み込み時に日本語が文字化けしてしまうことがあります。そういう場合は「ファイル」-「再読込」でUTF-8を指定してください。 Macintosh用テキストエディタ CotEditor(CotEditor配布元) mi(mi配布元/mi 用の PHP モード) 文字コード(UTF-8)について 正式にはUTF-8でバイトオーダー(BOM)無しです。ソフトによってはこれを「UTF-8N」や「UTF-8(no signature)」などと表記していますが、わざわざBOM有りにする必要は有りません。 FTPソフト DLしたEasyBotterをサーバーへアップロードする為に必要です。 @PAGESなどのサーバーにはファイルマネージャーという機能があります。 これを使う場合には、FTPソフトは必要ありません。 Windows用 FFFTP(配布元) FileZilla(配布元) Mac用 FireFTP(配布元) ※Firefoxアドオン FileZilla(配布元)
https://w.atwiki.jp/easybotter_wiki/pages/27.html
※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。 TL反応でも会話終了( [ [ END ] ] )を機能させたい。 [#d3c85f4b] コメント [#g7968718] TL反応でも会話終了( [ [ END ] ] )を機能させたい。 [#d3c85f4b] EasyBotter.php内 //タイムラインへの反応を作る function makeReplyTimelineTweets($timeline, $replyPatternFile){ (略) $replyTweets[] = $re; } return $replyTweets; } とある部分の $replyTweets[] = $re; を if(!stristr($status,"[[END]]")){$replyTweets[] = $re;} と変更する。 コメント [#g7968718] 名前 コメント
https://w.atwiki.jp/easybotter_wiki/pages/33.html
このページへ誘導されてきた方へ このページに「回答」はありません、脱初心者を目指す意欲的な方のお勉強の取っ掛かりをサポートするページです。 このページを読解していただくことでbot.php編集における基本・応用がこなせるようになります。 ソースのコピペは思わぬ誤作動の元となりやすく、またコピペで済ませることで誤作動の原因に気付きにくくなる欠点があります。 bot.phpを構成しているPHPのパーツを理解することで、bot.phpの全体を正しく把握し制御できるようになります。 ここでは「プログラミングができなくても~」というEasyBotterの基本にもとづき、あえてプログラミングの説明らしからぬ方法で説明している部分もあります。 プログラミング初心者にプログラミングの基礎を学んでもらうモノなので、プログラミング慣れした方には違和感あるかと思いますがご容赦ください。 またEasyBotterに関連するものに特化して説明していますので、PHP自体に興味をもたれた方は本家のマニュアルなどを参照されると良いでしょう。 EasyBotterは基本性能が備わっているので、基礎を勉強することで比較的容易に改造に着手することができます。 botをの機能を発展させたいと思う方は是非、基礎を勉強してみてください。 時間分けとは? 制御構造「if」ifの基本形 ifの拡張機能 if文の複雑化 if文の要素一覧 関数とは?date関数 演算子とは?代数演算子とは?代数演算子 比較演算子とは?比較演算子 論理演算子とは?論理演算子 代入演算子とは?代入演算子 演算子の優先順位 変数とは?変数の設定 最後に コメント 時間分けとは? botの動作を複雑化させる為に必要な時間分けですが、何から調べればよいのかわからない、という方も多いのではないでしょうか。 ここでは時間分けで使う内容を分解しそれぞれを理解することで、時間分けをマスターします。 時間分けを理解している方は以下の内容を正しく理解できるでしょう。 if(date("G") == 7 date("i") == 30){ $response = $eb- postRandom("0730.txt"); } 正解は「7時かつ30分の場合、0730.txtからランダムポストを行い、7時かつ30分の場合の処理を終える」です。 簡単に書けば「7時30分に0730.txtからランダムポスト」で済みますが、上記のように書いたのには理由があります。 bot.phpにおいては、関数や演算子などを条件文に入れ込むことで構成されていきます。 「関数」「演算子」「条件文」というと難しいイメージを持つかもしれませんが、パターンは多くありません。 まずは時間分けの基本形を知ることで、複雑な動作を分解してみましょう。 制御構造「if」 ここではifを使った条件分岐を説明しますが、初めに「プログラムは書かれた順に実行される」ということを覚えていてください。 これはこの項目に限らず全てのプログラムに通じるものです。 つまり条件をいくつも提示した場合、先に書かれた条件が優先されるのです。 ifの基本形 まずはif文の基本形を見てみましょう。 if(条件){処理;} たったこれだけです。 if文は英語の「もし~ならば」という意味と同じで、この場合は「もし条件に当てはまるなら処理をする」というものです。 if(条件1){処理1;} if(条件2){処理2;} if(条件3){処理3;} このように何行も並列していけばこの基本形だけで時間分けは可能ですが、スマートな書き方とは言い難いものです。 ifの拡張機能 それではif文の拡張機能「else if」「else」を使ってみましょう。 if(条件1){ 処理1; } else if(条件2){ 処理2; } else{ 処理3; } elseは英語の「その他」という意味と同じとなります。 else ifは「他にもし~ならば」、elseは「その他の場合は」、となります。 ここで問題です、【条件1】にも【条件2】にも当てはまる場合、処理はどのようになるのでしょうか? ここで「プログラムは書かれた順に実行される」を思い出しましょう。 書かれた順、つまり最初の【条件1】に対応する【処理1】が行われることはわかりますね? では【条件2】にも当てはまっているので【処理2】も行われるのでしょうか……答えはNO。 「else」という英単語には「その他」という意味があることは先に説明しましたが、これには「既にあるものは除いて」という意味が含まれています。 つまり、【条件1】に当てはまるものは【処理1】が終わった時点で終了、【条件1】に当てはまらなかったものだけが【条件2】の判定へ進むことができるのです。 また【条件1】にも【条件2】にも当てはまらない、つまり「その他の場合」は【処理3】が実行されます。 if文の複雑化 if文は一つの条件で二つ以上の処理をすることもできます。 if(条件1){ 処理1a; 処理1b; } else if(条件2){ 処理2a; 処理2b; } else{ 処理a; 処理b; } また、「if」「else if」「else」の処理にさらなるif文を入れ込むこともできます。 if(条件1){ if(条件a){ 処理1a; } else if(条件b){ 処理1b; } else{ 処理1; } } else if(条件2){ if(条件a){ 処理2a; } else{ 処理2; } } else{ if(条件a){ 処理a-1; 処理a-2; 処理a-3; } } if文は上記のような2段階に限らず、3段階4段階と増やすことができます。 if文の要素一覧 if もし【条件】に当てはまるなら【処理】を実行、「}」以降に条件を持ちこさない 条件分岐させる場合、必ず最初に書くもの。(ただし並列して実行する条件分岐は別) else if 他にもし【条件】に当てはまるなら【処理】を実行、「}」以降に条件を持ちこさない 「if」または「else if」の後につけることができる。なくても良い。 else その他の場合は【処理】を実行、「}」で同列冒頭にあるif文を終了する 「if」「else if」の条件のどれにも当てはまらない場合の処理。なくても良い。 () 【条件】内容を丸括弧で囲む 「if」「else if」で使えるが、「else」では使えない。条件は演算子を使うことで複雑化・詳細化できる。 {} 【処理】内容を波括弧で囲む 「if」「else if」「else」のいずれでも必要。複数行可、複数の処理を書いても良い。 ; 【処理】内容の最後に必要なセミコロン これを忘れるとエラーになる、消し過ぎに注意。 関数とは? 「関数」とは一定の処理を行いその結果や値を反映させるものです。 EasyBotterでは特にbot.phpで時間わけをする時に使う「date関数」がなじみ深く、また重要な関数となります。 ここではEasyBotterで使うdate関数について説明します。 date関数 bot.phpでの使用頻度が高い物、bot.phpの動作が工夫できるものを紹介しています。 詳細はPHPマニュアルをご覧ください。 単位 date("?") 値 特徴 利用法 年 Y 2011など 4桁の西暦 y 11など 下2桁の西暦 L 0~1 0=平年、1=うるう年 2月やdate("z")を使う時に有用 月 n 1~12 1桁の月には0をつけない bot.phpで使う機会が多い、覚えてしまおう m 01~12 1桁の月に0をつける t 28~31 その月が何日まであるか date("t")とdate("j")の値が同じ時は月末日、など 日 j 1~31 1桁の日には0をつけない bot.phpで使う機会が多い、覚えてしまおう d 01~31 1桁の日に0をつける z 0~365 その年の何日目か(1月1日が0) 34(立春)以降は春、124/125(5月5日/立夏)以降は夏~など工夫できる 時 G 0~23 24時制、1桁には0をつけない bot.phpで頻出、覚えてしまおう H 00~24 24時制、1桁に0をつける g 0~12 12時制、1桁には0をつけない h 00~12 12時制、1桁に0をつける A AM、PM 午前午後、大文字 12時制の時に有用 a am、pm 午前午後、小文字 分 i 00~59 1桁には0をつける bot.phpで頻出、覚えてしまおう 秒 s 00~59 1桁には0をつける CRONとの誤差が生じやすい為あまり使う事は無い 曜日 w 0~6 0=日曜、1=月曜…6=土曜 数値なので1~5は平日、その他は週末、という分け方も D Mon~Sun 英語の略表記 "w"の意味がわからない方に…スペルミスに注意 演算子とは? 代数演算子とは? 加減乗除など、主に数値の計算をするものです。(文字列などによる例外もあります) bot.phpでは「%」を使う機会が多いのですが、その意味を間違えている方も少なくありません。 いずれも小学校で習う算数レベルなので、意味を理解すれば難しいものではありません。 代数演算子 bot.phpでの使用頻度が高い物を紹介しています。 詳細はPHPマニュアルをご覧ください。 + A + B 加算 AにBを足した値 「3 + 7」の値は「10」 - A - B 減算 AからBを引いた値 「19 - 9」の値は「10」 * A * B 乗算 AにBを掛けた値 「2 * 5」の値は「10」 / A / B 除算 AをBで割った値 「10 / 4」の値は「2.5」 % A % B 剰余 AをBで割った時の余り 「10 % 7」の値は「3」 比較演算子とは? 名前の通り、演算子の左右にあるものを比較します。 bot.phpの編集において欠かせないものですので、是非覚えましょう。 また、使い方次第で複雑な設定をすることができます。 比較演算子 bot.phpでの使用頻度が高い物を紹介しています。 詳細はPHPマニュアルをご覧ください。 A == B AとBが等しい A === B AとBが同型かつ等しい A != B AとBが等しくない A B A !== B AとBが同型でないか等しくない A B AがBより少ない A B AがBより多い A = B AがB以下 A = B AがB以上 これも小学生で習うことですが、「より少ない」「より多い」はその数値を含まない、「以下」「以上」はその数値を含む、という算数の基本を間違えないよう注意。 論理演算子とは? 論理演算をおこなう為の演算子です……「論理演算」と聞くと耳慣れませんが、「ベン図」と聞くとピンと来る方もいるかと思います。 (ベン図についてはWikipediaの論理演算とペン図に詳しいのでこの場では説明を省略します。) 条件の組み合わせを一つの式の中に収める為に使われるもので、AND・OR・NOTという基本で成り立ちます。 論理演算子 bot.phpでの使用頻度が高い物を紹介しています。 詳細はPHPマニュアルをご覧ください。 A B AかつBの場合【優先度:高】 A || B AまたはBの場合【優先度:高】「||」はwiki仕様の都合上全角になっています、半角に直して下さい A and B AかつBの場合【優先度:低】 A or B AまたはBの場合【優先度:低】 A xor B AとBのうちどちらかにだけ当てはまる場合 !A Aに当てはまらない場合 「A B C」「A || B || C」「A B or C D」のように、複数の論理演算子を使うこともできます。 ちなみに「A B or C D」は優先順位の関係で「AかつB、または、CかつDの場合」となります。 代入演算子とは? 文字通り「代入」する為の演算子で、代入するものは数値に限らず文字列も代入することが可能です。 代入演算子の左辺にくるものは「$a」のような変数であることが殆どです。 この代入演算子はbot.php編集において必須の要素ではありません、脱初心者してから考える事で説明していますが、EasyBotterにおいては完全に脱初心者してからとりかかる分野となります。 代入演算子 bot.phpでの使用頻度が高い物を紹介しています。 A = B AにBを代入する 結果的にA=B A += B AにBを加算したものを、Aに代入する 結果的にA+B A .= B AにBを続けて、Aに代入する 結果的にAB A ++ Aに1を加算したものを、Aに代入する 結果的にA+1 A -- Aから1減算したものを、Aに代入する 結果的にA-1 演算子の優先順位 全ての演算子には優先順位が設定されており、複雑な動作を構築する上で留意しておかなければなりません。 特に論理演算子は当該項目でも説明していますが、動作に大きく影響するものなので優先順位を把握し適切に使用しましょう。 詳細はPHPマニュアルをご覧ください。 変数とは? 変数はプログラムにおける一時的なデータの事で、特定の文字列や数値に名前をつけることができます。 この変数はbot.php編集において必須の要素ではありません、脱初心者してから考える事で説明していますが、EasyBotterにおいては完全に脱初心者してからとりかかる分野となります。 変数の設定 変数名は「半角英数(a~z、A~Z、0~9)」及び「アンダーバー(_)」ならば下記の事項以外で特に制限はありません。 変数名は必ず「$」から始めなければなりません 「$」の直後に半角数字を置く事はできません 「$」の直後は半角アルファベットまたはアンダーバーでなければなりません 大文字と小文字は別の文字として扱われます 「$12345」という変数名は数字から始まっているのでダメですが、「$abc123」や「$_1234」はOKです。 また「$ABCD」「$Abcd」「$abcd」は大文字・小文字の差異がある為、全て別の変数として扱われます。 基本的に変数名に使用する文字数に制限はありません、「$a」のような1文字でも良いですし「$today_year_month_day_week」のような長いものでも大丈夫です。 自分で命名できるものですから、自分がわかるものならば大丈夫です。 ただし、文字数が多くなり過ぎるとスペルミスも起こりやすくなるので「$today_year_month_day_week」は「$today_YMDW」と短縮するなど、個人で考えて使用してください。 最後に ここまで読んでいただければ、このページ冒頭の時間分けとは?で書いた if(date("G") == 7 date("i") == 30){ $response = $eb- postRandom("0730.txt"); } を「7時30分に0730.txtからランダムポスト」ではなく、「7時かつ30分の場合、0730.txtからランダムポストを行い、7時かつ30分の場合の処理を終える」が正解である、と説明したことを理解していただけたと思います。 それでは例題です、難しい構造ではないのでわかりますね? if(date("G") == 7 date("i") == 30){ $response = $eb- postRandom("0730.txt"); } else if(date("G") == 12 date("i") == 0){ if(date("w") == 0 || date("w") == 6){ $response = $eb- postRandom("1200_weekend.txt"); } else{ $response = $eb- postRandom("1200_weekday.txt"); } } else if(date("G") == 23 date("i") == 30){ $response = $eb- postRandom("2330.txt"); } else{ $response = $eb- postRandom("sonota.txt"); } if(date("n") == 1 date("j") == 1 date("G") == 0 date("i") == 0){ $response = $eb- postRandom("newyear.txt"); } 正解は、「毎日7 30に0730.txtからランダムポスト、土日の12 00に1200_weekend.txtからランダムポスト、月~金曜日の12 00に1200_weekday.txtからランダムポスト、毎日23 30に2330.txtからランダムポスト、それ以外の実行はsonota.txtからランダムポスト。1月1日0時00分にnewyear.txtからランダムポスト。」です。 日時での条件分岐はつい「月→日→時→分」という順番で条件付けしがちですが、毎日同じ時間に実行するものを日にちや曜日で変えたい場合は、先に時間を指定してから日にちや曜日で分岐させる方がスマートな構造になります。 また、先に「時」「分」のようにちょっとしたズレで数値が変わってしまうものを条件判定することで、時間ズレ対策にもなります。 是非、工夫を凝らしてあなたなりのbot.phpを書いてみて下さい。 コメント とりあえず一通りの説明を書き終えました、内容の修正等ありましたらご自由にどうぞ。その他何かあればEasyBotterBBS内の非公式wkiスレに書いていただければと思います。 -- あずき (2011-07-04 00 32 19) あずき様、更新お疲れ様でした! -- 名無しさん (2011-07-04 23 13 04) わかりやすくて目から鱗です 有難うございます -- aisk (2011-11-10 15 52 12) 名前 コメント
https://w.atwiki.jp/easybotter_wiki/pages/18.html
まずはbot.phpに書かれている説明と公式サイトの"基本の設定"解説を熟読しよう。 wikiを見ても分からないところが出てきたら質問スレッドで質問しよう! bot.phpやEasyBotter.phpを編集する上で、基本使いそうなPHP制御構造等はTwitter Bot関連リンクにお勧め解説サイトをリンクしています。 ※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメントを書く」から誰かに頼んで下さい。 フッターが追加されません(ver.2.04) bot.phpを編集する時に注意!reply_pattern.php内の反応単語に該当しなかった場合、返信させたくないので"data.txt"を外したのですが動きません。 reply_pattern.php内の反応単語に該当しなかった場合、reply_pattern2.phpをチェックさせたいのですが動きません。 超初心者向けFAQdata.txtやlog.datが見あたらないのですが フッターが追加されません(ver.2.04) 現在、フッターが正常に機能していません。 {tweet}等{}を使用した文章時のみ追加される仕様になっています。 不具合一覧にてひとまず解決法を解説していますので、そちらを参考に。 bot.phpを編集する時に注意! 質問スレでよく見かける注意したいことをまとめます。 reply_pattern.php内の反応単語に該当しなかった場合、返信させたくないので"data.txt"を外したのですが動きません。 $response = $eb- reply(2,"reply_pattern.php"); というのを見かけました。 勝手に判断して必要部分を削除しないで下さい cron間隔,"",""と記入することで動作します。 反応単語に該当しなかった時返信させたくない場合は $response = $eb- reply(2,"","reply_pattern.php"); と記入しましょう。 reply_pattern.php内の反応単語に該当しなかった場合、reply_pattern2.phpをチェックさせたいのですが動きません。 $response = $eb- reply(2,"data.txt","reply_pattern2.php","reply_pattern.php"); というのを見かけました。 勝手に判断して記述を増やさないで下さい reply_pattern2.phpをチェックさせるには改造が必要です。 超初心者向けFAQ data.txtやlog.datが見あたらないのですが 下のページを見て拡張子を表示させましょう。 ファイルの拡張子を表示するには?
https://w.atwiki.jp/easybotter_wiki/pages/37.html
※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。 特定のアカウントに対しては、別のリプライパターンを読み込ませたい コメント 特定のアカウントに対しては、別のリプライパターンを読み込ませたい EasyBotter.php内 function makeReplyTweets($replies, $replyFile, $replyPatternFile){ if(empty($this- _replyPatternData[$replyPatternFile]) !empty($replyPatternFile)){ $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); } (略) foreach($this- _replyPatternData[$replyPatternFile] as $pattern = $res){ 1. if(empty($this- _replyPatternData[$replyPatternFile]) !empty($replyPatternFile)){ の直後に $org_repfile = $replyPatternFile;//デフォルトのファイル名を保管 を追記する。 2. foreach($this- _replyPatternData[$replyPatternFile] as $pattern = $res){ の直前に //■■特定の人には別パターン■■ $userName = (string)$reply["user"]["screen_name"]; switch(true){ case stristr($userName, "bot") //botと名のつくアカウント名に対して $replyPatternFile = "bot_pattern.php";//bot_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); break; case $userName == "abcd" //abcdというアカウント名に対して case $userName == "efgh" //efghというアカウント名に対して $replyPatternFile = "xxx_pattern.php";//xxx_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); break; default //それ以外 $replyPatternFile = $org_repfile;//デフォルトのパターンファイル名 } または //■■特定の人には別パターン■■ $userName = (string)$reply["user"]["screen_name"]; if(stristr($userName, "bot")){//botと名のつくアカウント名に対して $replyPatternFile = "bot_pattern.php";//bot_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); }else if($userName == "abcd" || $userName == "efgh"){ $replyPatternFile = "xxx_pattern.php";//xxx_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); }else{ $replyPatternFile = $org_repfile;//デフォルトのパターンファイル名 } を追記する。 コメント 作成感謝!! -- 名無しさん (2013-02-17 16 04 35) ID除外の方を書き変えたり思考錯誤していますが上手くいかず…記載があれば助かります; -- 名無しさん (2013-02-21 16 21 23) これは複数人に対して個別のパターンにできるものでしょうかね -- 名無しさん (2013-03-12 02 08 18) 特定のIDに対して特定の月日だけと絞り込むこともできるかな・・・・・・ -- 名無しさん (2013-05-30 17 29 23) 名前 コメント
https://w.atwiki.jp/easybotter_wiki/pages/31.html
//通常のフォローユーザ、特定のユーザ、Bot、ごとにタイムライン反応用パターンファイルを変えるサンプルです。 //Bot宛に決まった台詞で話しかけることで特定のユーザリストに追加されます。 //タイムライン反応を作成するときに、特定のユーザリストを見て、反応ファイルを変更します。 //動作保証はしません //EasyBotter 本体 //==================== //function makeReplyTweets //冒頭($replyTweets = array(); のあとあたり)に以下の2行を追加 $aryAdduser = array(); $aryDeluser = array(); //「if(empty($status) || $status == "[[END]]"){」の前に以下を追加 //タイムライン反応するユーザリストに追加 if (stristr($status, "[[REPTL]]")) { $user = (string)$reply- user- screen_name; $aryAdduser[] = $user; $status = str_replace("[[REPTL]]", "", $status); } //タイムライン反応するユーザリストから削除 if (stristr($status, "[[NOREPTL]]")) { $aryDeluser[] = (string)$reply- user- screen_name; $status = str_replace("[[NOREPTL]]", "", $status); } //「return $replyTweets;」の前に以下を追加 //-------------------- //タイムライン反応ユーザのファイルへの追加と削除 $userfname = "replyTLusers.txt"; if (count($aryAdduser) 0 || count($aryDeluser) 0) { if (file_exists($userfname) == false) { touch ($userfname); chmod($userfname, 606); } $buf = file($userfname); $fp = fopen($userfname, "a+"); flock($fp, LOCK_EX); $users = array(); foreach($buf as $u) { $u = trim($u); array_push($users, $u); } //追加 $users = array_merge($users, $aryAdduser); $users = array_unique($users); //削除 foreach ($aryDeluser as $u) { for ($i = 0; i count($users); $i++) { if (strcmp($users[$i], $u) == 0) { unset($users[$i]); break; } } } //ファイルへの書き込み ftruncate($fp, 0); foreach ($users as $u) { fputs($fp, $u."\n"); } fclose($fp); } //-------------------- //==================== //makeReplyTimelineTweets //「$replyTweets = array();」の前に以下を追加する $org_repfile = $replyPatternFile;//デフォルトのファイル名を保管 //「//リプライパターンと照合」の前に以下を追加する //ユーザリストを読み込む。 $fname = "replyTLusers.txt"; $users = array(); if (file_exists($fname)) { $tmp = file($fname); foreach($tmp as $u) { $users[] = trim($u); } } //■■特定の人には別パターン■■ $userName = (string)$tweet- user- screen_name; switch(true){ case stristr($userName, "bot") //botと名のつくアカウント名に対して $replyPatternFile = "bot_pattern.php";//bot_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); break; case in_array($userName, $users) echo " $userName - 特定ユーザ用反応 $text br / "; $replyPatternFile = "xxx_pattern.php"; //xxx_pattern.phpを適用する $this- _replyPatternData[$replyPatternFile] = $this- readPatternFile($replyPatternFile); break; default //それ以外 echo " $userName - デフォルト反応 $text br / "; $replyPatternFile = $org_repfile; //デフォルトのパターンファイル名 } //==================== //==================== //通常の@でリプライを返すパターンファイルに以下を追加。台詞などは適時変更OK。[[NOREPTL]] と [[REPTL]] が入っていることが必要。 "話し?かけないで" = array( "[[NOREPTL]]{name}さんにたくさん話しかけるのをやめます。", ), "話し?かけて" = array( "[[REPTL]]{name}さんにたくさん話しかけます。", ),